home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 2
/
SPACE - Library 2 - Volume 1.iso
/
music
/
7
/
modula
/
srpnsk.mod
< prev
Wrap
Text File
|
1985-11-19
|
3KB
|
136 lines
IMPLEMENTATION MODULE Sierpinski;
(* TDI GEM Demo : Draw Sierpinski curve *)
(* (c) TDI Software Ltd. 1985. *)
(*$S-*)(*$T-*)
FROM GEMVDIbase IMPORT
(* types *) VDIWorkInType, VDIWorkOutType ;
FROM VDIControls IMPORT
(* procs *) OpenVirtualWorkstation, CloseVirtualWorkstation ;
FROM VDIOutputs IMPORT
(* procs *) PolyLine ;
FROM AESGraphics IMPORT
(* procs *) GrafHandle;
FROM GemDem IMPORT
(* vars *) WorkX, WorkY, WorkWidth, WorkHeight ;
VAR currentX, currentY : INTEGER;
CONST SquareSize = 256;
VAR
Px, Py,
i, h,
x0, y0 : CARDINAL;
ch : CHAR;
Points : ARRAY [0..3] OF INTEGER;
handle : INTEGER;
In : VDIWorkInType;
Out : VDIWorkOutType;
dummy : INTEGER;
PROCEDURE Line ( direction, length : CARDINAL ) ;
PROCEDURE LineR(x, y : CARDINAL ) ;
VAR aX, aY : INTEGER;
BEGIN
aX := INTEGER(x);
aY := INTEGER(y);
Points [0] := currentX;
Points [1] := currentY;
currentX := currentX + aX;
currentY := currentY + aY;
Points [2] := currentX;
Points [3] := currentY;
PolyLine (handle, 2, Points);
END LineR;
BEGIN
CASE direction OF
0 : LineR(length,0 ) ; |
1 : LineR(length,length) ; |
2 : LineR(0,length) ; |
3 : LineR(-INTEGER(length),length) ; |
4 : LineR(-INTEGER(length),0) ; |
5 : LineR(-INTEGER(length),-INTEGER(length)) ; |
6 : LineR(0,-INTEGER(length)) ; |
7 : LineR(length,-INTEGER(length)) ; |
END ;
END Line ;
PROCEDURE A ( k : CARDINAL );
BEGIN
IF k > 0 THEN
A(k-1); Line(7,h); B(k-1); Line(0,h);
D(k-1); Line(1,h); A(k-1);
END;
END A;
PROCEDURE B ( k : CARDINAL );
BEGIN
IF k > 0 THEN
B(k-1); Line(5,h); C(k-1); Line(6,h);
A(k-1); Line(7,h); B(k-1);
END;
END B;
PROCEDURE C ( k : CARDINAL );
BEGIN
IF k > 0 THEN
C(k-1); Line(3,h); D(k-1); Line(4,h);
B(k-1); Line(5,h); C(k-1);
END;
END C;
PROCEDURE D ( k : CARDINAL );
BEGIN
IF k > 0 THEN
D(k-1); Line(1,h); A(k-1); Line(2,h);
C(k-1); Line(3,h); D(k-1);
END;
END D;
CONST Depth = 6; (* because it looks nice *)
PROCEDURE DoSierpinski;
BEGIN
FOR dummy := 0 TO 8 DO In [dummy] := 1 END;
In [10] := 2;
handle := GrafHandle (dummy, dummy, dummy, dummy);
OpenVirtualWorkstation (In, handle, Out);
i := 0;
h := SquareSize DIV 8; (* to accomodate resolution *)
x0 := CARDINAL(WorkWidth-WorkX-1) DIV 2 + CARDINAL(WorkX);
y0 := CARDINAL(WorkHeight-WorkY-1) DIV 2 + h + CARDINAL(WorkY);
REPEAT
INC (i);
DEC (x0,h);
h := h DIV 2;
INC (y0,h);
currentX := x0;
currentY := y0;
A (i); Line (7,h);
B (i); Line (5,h);
C (i); Line (3,h);
D (i); Line (1,h);
UNTIL (i = Depth);
CloseVirtualWorkstation (handle);
END DoSierpinski;
END Sierpinski.
əəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəə